/**
 *	Copyright
 *	...
 */

#ifndef Serial_h
#define Serial_h

#include "xparameters.h"
#include "xio.h"
#include "xuartns550.h"
#include "xintc.h"



//TODO een test schrijven die nakijkt of er wel zoveel geheugen is
#define BUFFER_SIZE 128
#define TEST_BUFFER_SIZE 100

struct ring_buffer {
  Xuint8 buffer[BUFFER_SIZE];
  Xuint32 head;
  Xuint32 tail;
};

//typedef void UartNs550IntrHandler(void *CallBackRef, u32 Event, unsigned int EventData);

int enableInterrupt(XIntc *IntcIntancePtr, Xuint16 UartIntrId);

class Serial{

private:
	Xuint16 UartId;
	Xuint16 DeviceId;
	Xuint32 DeviceBaseAddress;
	Xuint32 DeviceClockFreq;
	Xuint16 UartIntrId;
	XUartNs550 UartNS550;
	XIntc* IntcPtr;
	//Is er wel een buffer nodig voor zenden?
	//ring_buffer SendBuffer; /* Buffer for Transmitting Data */
	ring_buffer RecvBuffer;

	u8 SendBuffer[TEST_BUFFER_SIZE];
	u32 Index;

public:
	Serial();
	Serial(Xuint16 UartId);
	int begin(long baud);
	void write(Xuint8 c);
	//void write(char *str);
	void write(void); //TODO verwijderen
	void print(const char str[]);
	void println();
	void println(const char str[]);
	void store_char(Xuint8 c); //char van maken??

	//TODO
	/*
	 * - De verwachte functie: -
	 * Get the number of bytes available for reading fromt the Serial port.
	 * This is data that already is received and stored in the serial buffer.
	 *
	 * -> De IP core heeft maar een buffer van 8 bits, 1 char dus.
	 * We moeten dus een software buffer invoeren (RecvBuffer). Deze werkt enkel met
	 * interrupten.
	 * ? 16 bits or 32 ?
	 */
	Xuint16 available();

	//TODO
	/*
	 * - De verwachte functie: -
	 * Waits for the transmission of outgoing serial data to complete.
	 *
	 * -> Is deze wel nodig
	 */
	void flush();

	//TODO
	/* - De verwachte functie: -
	 * Reads the first byte of incoming serial data available.
	 *
	 * -> Wrs wacht deze functie tot er een character kan gelezen worden
	 */
	Xuint8 read();




};

#endif
